﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CSGame;

namespace Common
{
	[Serializable]
    /// <summary>
    /// Ход по шахматной доске
    /// </summary>
    public class ChessStep
    {
        private FigurePosition _start; 
        private FigurePosition _finish;

        /// <summary>
        /// Создает новый экземпляр хода
        /// </summary>
        /// <param name="start">Начальная позиция</param>
        /// <param name="finish">Конечная позиция</param>
        public ChessStep(FigurePosition start, FigurePosition finish)
        {
            _start = start;
            _finish = finish;
        }

        /// <summary>
        /// Создает новый экземпляр хода
        /// </summary>
        /// <param name="sv">Вертикаль стартовой позиции</param>
        /// <param name="sh">Горизонталь стартовой позиции</param>
        /// <param name="fv">Вертикаль конечной позиции</param>
        /// <param name="fh">Горизонталь конечной позиции</param>
        public ChessStep(int sv, int sh, int fv, int fh)
        {
            _start = new FigurePosition(sv, sh);
            _finish = new FigurePosition(fv, fh);
        }

        #region Свойства
        public FigurePosition Start
        {
            get { return _start; }
            set { _start = value; }
        }

        public FigurePosition Finish
        {
            get { return _finish; }
            set { _finish = value; }
        }
        #endregion

        public override string ToString()
        {
            return _start.ToString() + "-" + _finish.ToString();
        }
    }


	[Serializable]
    /// <summary>
    /// Позиция на доске
    /// </summary>
    public struct FigurePosition
    {
        private int _horizontal;
        private int _vertical;

        public FigurePosition(int v, int h)
        {
            _vertical = v;
            _horizontal = h;
        }

        #region Свойства

        /// <summary>
        /// Горизонталь, на которой находится фигура (от 0 до 7)
        /// </summary>
        public int Horizontal
        {
            get { return _horizontal; }
            set
            {
                if (value > 7 || value < 0)
                    throw new ChessException("Ход за пределы доски!");
                else
                    _horizontal = value;
            }
        }


        /// <summary>
        /// Вертикаль, на которой находится фигура (от 0 до 7, а в жизни - от А до H)
        /// </summary>
        public int Vertical
        {
            get { return _vertical; }
            set
            {
                if (value > 7 || value < 0)
                    throw new ChessException("Ход за пределы доски!");
                else
                    _vertical = value;
            }
        }

        #endregion

        public override string ToString()
        {
            char[] lol = new char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H' };

            return lol[_vertical] + (_horizontal + 1).ToString();
        }
    }


    /// <summary>
    /// Для событий связанных с выполнением хода
    /// </summary>
    public class ChessBeforeStepEventArgs :EventArgs 
    {
        private ChessStep _step; // ход, Кэп

        public ChessBeforeStepEventArgs(ChessStep step)
        {
            _step = step;
        }

        public ChessStep Step
        {
            get { return _step; }
        }
    }


    /// <summary>
    /// Для событий связанных с выполнением хода
    /// </summary>
    public class ChessAfterStepEventArgs : EventArgs
    {
        private ChessStep _step; // ход, Кэп
        private bool _danger; // есть ли шах
        private string _notation; // нотация хода

        public ChessAfterStepEventArgs(ChessStep step, string notation, bool danger)
        {
            _step = step;
            _danger = danger;
            _notation = notation;
        }

        public string Notation
        {
            get { return _notation; }
        }

        public bool Danger
        {
            get { return _danger; }
        }

        public ChessStep Step
        {
            get { return _step; }
        }
    }


    public delegate void ChessBeforeStepEventHandler (object sender, ChessBeforeStepEventArgs e);
    public delegate void ChessAfterStepEventHandler(object sender, ChessAfterStepEventArgs e);

}
